#include <stdio.h>

int main(int argc, const char *argv[])
{
	// 表示定义了一个二维数组 数组名叫s
	// 数组中共有 3行4列 共计 12个元素
	// 每个元素都是一个int类型的变量
	int s[3][4];

	// 二维数组的大小 == 行*列*单个元素 == 3 * 4 * sizeof(int) == 48
	printf("sizeof(s) = %ld\n", sizeof(s)); // 48

	// 二维数组访问元素的方式
	// 数组名[行号][列号]   注意:行号和列号都是从0开始的
	// 当取出二维数组中的一个元素后 对其的操作和操作单个变量是一模一样的
	s[0][0] = 10; // 写操作
	s[1][2] = 20;
	printf("%d\n", s[0][0]); // 读操作
	printf("%d\n", s[1][2]);

	// 二维数组的遍历
#if 0
	// 按一维数组的方式访问
	int i = 0;
	for(i = 0; i < 3*4; i++){
		printf("%d ", s[0][i]);
		if((i+1)%4 == 0){
			printf("\n");
		}
	}
#else
	// 按行列的方式访问--常规用法
	int i = 0;
	int j = 0;
	// 外层循环控制行数
	for(i = 0; i < 3; i++){
		// 内层循环控制列数
		for(j = 0; j < 4; j++){
			printf("%d ", s[i][j]);
		}
		printf("\n");
	}
#endif
	printf("-----------------------------------\n");

	// 二维数组的元素在内存也是连续的
	for(i = 0; i < 3; i++){
		for(j = 0; j < 4; j++){
			printf("%p ", &s[i][j]); // 依次相差4字节 一个元素的大小
		}
		printf("\n");
	}

	// 二维数组的数组名也是常量 也不能被赋值
	int s2[3][4];
	// s2 = s; // 错误的
	// s2++; // 错误的 

	return 0;
}
